package cn.fj.xiaowei.main.service.website.info.service.impl;

import cn.fj.xiaowei.main.common.redis.utils.KeyRedisUtil;
import cn.fj.xiaowei.main.common.redis.utils.ObjValRedisUtil;
import cn.fj.xiaowei.main.service.website.info.constant.WebsiteInfoRedisKey;
import cn.fj.xiaowei.main.service.website.info.po.WebsiteInfoPo;
import cn.fj.xiaowei.main.service.website.info.mapper.WebsiteInfoMapper;
import cn.fj.xiaowei.main.service.website.info.service.WebsiteInfoService;
import cn.fj.xiaowei.main.service.website.info.utils.WebsiteInfoCreator;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Objects;

/**
 * <p>
 * 网站信息表 服务实现类
 * </p>
 *
 * @author xiaowei
 * @since 2024-05-05 16:26:05
 */
@Service
public class WebsiteInfoServiceImpl extends ServiceImpl<WebsiteInfoMapper, WebsiteInfoPo> implements WebsiteInfoService {

    @Autowired
    private KeyRedisUtil keyRedisUtil;

    @Autowired
    private ObjValRedisUtil objValRedisUtil;

    @Override
    public WebsiteInfoPo findByName(String name) {
        // 如果 Redis 缓存中存在，则从 Redis 缓存中查找
        if (keyRedisUtil.contain(name)) {
            return objValRedisUtil.get(WebsiteInfoRedisKey.generateKey(name));
        }
        // Redis 缓存中不存在，从数据库中查找
        WebsiteInfoPo websiteInfoPo = baseMapper.selectByName(name);
        // 如果查找的网站信息在数据库中存在，则将从数据库中查找的结果放入 Redis 缓存中
        if (Objects.nonNull(websiteInfoPo)) {
            objValRedisUtil.set(WebsiteInfoRedisKey.generateKey(name), websiteInfoPo);
        }
        return websiteInfoPo;
    }

    @Override
    public boolean updateByName(String name, String info) {
        try {
            // 从数据库中查询要进行更新的网站信息
            WebsiteInfoPo websiteInfoPo = baseMapper.selectByName(name);
            // 如果数据库中不存在，则会将要更新的网站信息作为一条新记录插入到数据库中
            if (Objects.isNull(websiteInfoPo)) {
                websiteInfoPo = WebsiteInfoCreator.createWebsiteInfoPo(name, info);
                baseMapper.insert(websiteInfoPo);
            } else {
                // 如果数据库中存在，则更新数据库中的记录
                websiteInfoPo.setInfo(info);
                baseMapper.updateById(websiteInfoPo);
            }
            // 数据库中的数据记录更新完成后，对 Redis 缓存中相应的网站信息进行更新
            objValRedisUtil.set(WebsiteInfoRedisKey.generateKey(name), websiteInfoPo);
            // 由于获取网站信息时，如果 Redis 缓存中不存在，会从数据库中查找，并将查询结果缓存到 Redis 中，
            // 因此这里不对 Redis 缓存是否更新成功进行判断
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
